package exercise;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;

@Slf4j(topic = "c.ExerciseSell")
public class ExerciseSell {
    public static void main(String[] args) throws InterruptedException {
        //模拟多人买票
        TicketWindow window = new TicketWindow(1000);
        //卖出的票数统计
        List<Integer> amountList = new Vector<>();
        //所有线程的集合
        List<Thread> threadList = new ArrayList<>();
        for (int i = 0; i < 4000; i++) {
            Thread t = new Thread(()->{
                /*临界区*/
                int amount = window.sell(randomAmount());
                /*临界区*/
                amountList.add(amount);
            });
            threadList.add(t);
            t.start();
        }
        for (Thread thread : threadList) {
            thread.join();
        }
        //统计卖出的票数和剩余票数
        log.debug("卖出：{}",amountList.stream().mapToInt(i->i).sum());
        log.debug("余票：{}",window.getCount());
    }
    //Random为线程安全
    static Random random = new Random();
    //随机1~5
    public static int randomAmount(){return random.nextInt(5)+1;}

}

//售票窗口
class TicketWindow{
    private int count;
    public TicketWindow(int count){this.count = count;}

    //获取余票数量
    public int getCount(){
        return count;
    }

    //售票方法
    public synchronized int sell(int amount){
        if (this.count > amount){
            this.count -= amount;
            return amount;
        }else {
            return 0;
        }
    }
}
